ãã©ãŠã¶æ¡åŒµæ©èœããããã§ã¹ãV3ãžç§»è¡ããéçºè åãç·åã¬ã€ããJavaScript APIã®å€æŽç¹ãšãã°ããŒãã«ãªå©çšè ã«åãã广çãªç§»è¡æŠç¥ã«çŠç¹ãåœãŠãŠããŸãã
ãããã§ã¹ãV3ãžã®ç§»è¡ïŒãã©ãŠã¶æ¡åŒµæ©èœ JavaScript APIç§»è¡æŠç¥
ãã©ãŠã¶æ¡åŒµæ©èœéçºã®ç¶æ³ã¯çµ¶ããé²åããŠããŸããè¿å¹Žã®æãéèŠãªå€åã®äžã€ãããããã§ã¹ãV3ïŒMV3ïŒã®å°å ¥ã§ãããã®ã¢ããããŒãã¯Google Chromeãäž»å°ããä»ã®ChromiumããŒã¹ã®ãã©ãŠã¶ãããŸããŸãFirefoxã«ã圱é¿ãäžããŠãããäžçäžã®ãŠãŒã¶ãŒã®ã»ãã¥ãªãã£ããã©ã€ãã·ãŒãããã©ãŒãã³ã¹ãåäžãããããšãç®çãšããŠããŸããéçºè ã«ãšã£ãŠããã®ç§»è¡ã¯å€æŽç¹ãç¹ã«JavaScript APIã«é¢ããæ·±ãçè§£ãå¿ èŠãšããŸãããã®ç·åã¬ã€ãã¯ãæ¢åã®ãããã§ã¹ãV2æ¡åŒµæ©èœãMV3ã«å¹æçã«ç§»è¡ããããã®ç¥èãšæŠç¥ãæäŸããããªãã®äœåãæ°ããç°å¢ã§æ©èœãç¶ããæåããããšãä¿èšŒããŸãã
ãããã§ã¹ãV3ã«ãããäžæ žçãªå€æŽç¹ã®çè§£
ãããã§ã¹ãV3ã¯ããã©ãŠã¶æ¡åŒµæ©èœã®åäœæ¹æ³ã«é¢ããæ ¹æ¬çãªåèã衚ããŠããŸãããããã®å€æŽã®äž»ãªæšé²åã¯æ¬¡ã®ãšããã§ãã
- ã»ãã¥ãªãã£ã®åŒ·åïŒ MV3ã¯ãã峿 Œãªã»ãã¥ãªãã£ããªã·ãŒãå°å ¥ããæ¡åŒµæ©èœãå®è¡ã§ããã³ãŒãã®çš®é¡ãWebããŒãžãšã®å¯Ÿè©±æ¹æ³ãå¶éããŸãã
- ãã©ã€ãã·ãŒã®åäžïŒ æ°ããã¢ãã«ã¯ãç¹å®ã®æ©å¯APIãžã®ã¢ã¯ã»ã¹ãå¶éããããéææ§ã®é«ãããŒã¿åŠçãä¿é²ããããšã§ããŠãŒã¶ãŒã®ãã©ã€ãã·ãŒãéèŠããŸãã
- ããã©ãŒãã³ã¹ã®æ¹åïŒ ããã€ãã®å€ãã¢ãŒããã¯ãã£ããè±åŽããããšã§ãMV3ã¯æ¡åŒµæ©èœããã©ãŠã¶ã®é床ããªãœãŒã¹æ¶è²»ã«äžããããã©ãŒãã³ã¹ãžã®åœ±é¿ã軜æžããããšãç®æããŠããŸãã
JavaScript APIã®èгç¹ããæã圱é¿ã®å€§ãã倿Žã¯ã以äžã®ç¹ãäžå¿ã«å±éãããŸãã
- ããã¯ã°ã©ãŠã³ãããŒãžãããµãŒãã¹ã¯ãŒã«ãŒãžã®çœ®ãæãïŒ æ°žç¶çãªããã¯ã°ã©ãŠã³ãããŒãžã¢ãã«ã¯ãã€ãã³ãé§ååã®ãµãŒãã¹ã¯ãŒã«ãŒã«çœ®ãæããããŸããããã¯ãããã¯ã°ã©ãŠã³ãããžãã¯ãå¿ èŠãªãšãã«ã®ã¿å®è¡ãããããšãæå³ããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãããç¶æ 管çãã€ãã³ãåŠçã«ã¯ç°ãªãã¢ãããŒããå¿ èŠã§ãã
- Web Request APIã®å€æŽïŒ ãããã¯ãŒã¯ãªã¯ãšã¹ãã®ååã«åºã䜿çšãããŠãã匷åãª`chrome.webRequest` APIã¯ãMV3ã§å€§å¹ ã«å¶éãããŸããããã¯ããããã©ã€ãã·ãŒãä¿è·ããããã©ãŒãã³ã¹ãé«ããã®ã®ãæè»æ§ã«æ¬ ãã`declarativeNetRequest` APIã«çœ®ãæããããŸãã
- ã³ã³ãã³ãã¹ã¯ãªããã®å®è¡ã«é¢ãã倿ŽïŒ ã³ã³ãã³ãã¹ã¯ãªããã¯åç¶ããŸããããã®å®è¡ã³ã³ããã¹ããšæ©èœã¯æŽç·ŽãããŠããŸãã
- `eval()`ãš`new Function()`ã®åé€ïŒ ã»ãã¥ãªãã£äžã®çç±ããã`eval()`ãš`new Function()`ã¯æ¡åŒµæ©èœã³ãŒãå ã§ã®äœ¿çšãèš±å¯ãããªããªããŸããã
äž»èŠãªJavaScript APIã®ç§»è¡ãšæŠç¥
äž»èŠãªJavaScript APIã®ç§»è¡ã®è©³çްãšãããããã®å¹æçãªæŠç¥ã«ã€ããŠæãäžããŠãããŸãããã
1. ããã¯ã°ã©ãŠã³ãã¹ã¯ãªãããããµãŒãã¹ã¯ãŒã«ãŒãžã®ç§»è¡
ããã¯ééããªãæãæ ¹æ¬çãªå€æŽã§ãããããã§ã¹ãV2ã®æ¡åŒµæ©èœã¯ãåžžã«å®è¡ãããŠããæ°žç¶çãªããã¯ã°ã©ãŠã³ãããŒãžã«äŸåããããšããããããŸããããããã§ã¹ãV3ã§ã¯ãã€ãã³ãé§ååã§ãããã€ãã³ãïŒäŸïŒæ¡åŒµæ©èœã®ã€ã³ã¹ããŒã«ããã©ãŠã¶ã®èµ·åãã³ã³ãã³ãã¹ã¯ãªããããã®ã¡ãã»ãŒãžïŒã«ãã£ãŠããªã¬ãŒããããšãã«ã®ã¿å®è¡ããããµãŒãã¹ã¯ãŒã«ãŒãå°å ¥ãããŸãã
ãªã倿Žãããã®ãïŒ
æ°žç¶çãªããã¯ã°ã©ãŠã³ãããŒãžã¯ãç¹ã«å€ãã®æ¡åŒµæ©èœãã¢ã¯ãã£ããªå Žåã«ã倧éã®ãªãœãŒã¹ãæ¶è²»ããå¯èœæ§ããããŸããããµãŒãã¹ã¯ãŒã«ãŒã¯ããå¹ççãªã¢ãã«ãæäŸããæ¡åŒµæ©èœã®ããžãã¯ãå¿ èŠãªãšãã«ã®ã¿å®è¡ãããããšãä¿èšŒããããããã©ãŠã¶ã®èµ·åãéããªããã¡ã¢ãªäœ¿çšéãåæžãããŸãã
ç§»è¡æŠç¥ïŒ
- ã€ãã³ãé§ååããžãã¯ïŒ ããã¯ã°ã©ãŠã³ãããžãã¯ãã€ãã³ãé§ååã«åèšèšããŸããããã¯ã°ã©ãŠã³ãã¹ã¯ãªãããåžžã«å©çšå¯èœã§ãããšä»®å®ããã®ã§ã¯ãªããç¹å®ã®ã€ãã³ãããªãã¹ã³ããŸãããµãŒãã¹ã¯ãŒã«ãŒã®äž»èŠãªãšã³ããªãã€ã³ãã¯éåžž`install`ã€ãã³ãã§ãããããã§ãªã¹ããŒãèšå®ããæ¡åŒµæ©èœãåæåã§ããŸãã
- ã¡ãã»ãŒãžããã·ã³ã°ïŒ ãµãŒãã¹ã¯ãŒã«ãŒã¯åžžã«ã¢ã¯ãã£ãã§ã¯ãªããããæ¡åŒµæ©èœã®ç°ãªãéšåïŒäŸïŒã³ã³ãã³ãã¹ã¯ãªããããããã¢ããããªãã·ã§ã³ããŒãžïŒãšãµãŒãã¹ã¯ãŒã«ãŒãšã®éã§éåæã®ã¡ãã»ãŒãžããã·ã³ã°ã«å€§ããäŸåããå¿ èŠããããŸããéä¿¡ã«ã¯`chrome.runtime.sendMessage()`ãš`chrome.runtime.onMessage()`ã䜿çšããŸããã¡ãã»ãŒãžãã³ãã©ãå ç¢ã§ããµãŒãã¹ã¯ãŒã«ãŒãèµ·åããå¿ èŠãããå Žåã§ãã¡ãã»ãŒãžãåŠçã§ããããã«ããŠãã ããã
- ç¶æ
管çïŒ æ°žç¶çãªããã¯ã°ã©ãŠã³ãããŒãžã¯ã°ããŒãã«ãªç¶æ
ãã¡ã¢ãªå
ã«ç¶æã§ããŸããããµãŒãã¹ã¯ãŒã«ãŒã§ã¯ãã¯ãŒã«ãŒãçµäºãããšãã®ç¶æ
ã¯å€±ãããå¯èœæ§ããããŸãããµãŒãã¹ã¯ãŒã«ãŒã®çµäºåŸãç¶æããå¿
èŠãããç¶æ
ãæ°žç¶åããã«ã¯ã
chrome.storageïŒlocalãŸãã¯syncïŒã䜿çšããŸãã - ã©ã€ããµã€ã¯ã«ã®èªèïŒ ãµãŒãã¹ã¯ãŒã«ãŒã®ã©ã€ããµã€ã¯ã«ãçè§£ããŠãã ãããããã¯èµ·åã忢ãåèµ·åãããå¯èœæ§ããããŸããã³ãŒãã¯ãããã®é·ç§»ãé©åã«åŠçããå¿ èŠããããŸããäŸãã°ãèµ·åæã«ã¯åžžã«ã€ãã³ããªã¹ããŒãåç»é²ããŸãã
- äŸïŒ
ãããã§ã¹ãV2 (background.js):
chrome.runtime.onInstalled.addListener(() => { console.log('Extension installed. Setting up listeners...'); chrome.alarms.create('myAlarm', { periodInMinutes: 1 }); }); chrome.alarms.onAlarm.addListener((alarm) => { if (alarm.name === 'myAlarm') { console.log('Alarm triggered!'); // Perform some background task } });ãããã§ã¹ãV3 (service-worker.js):
// Service worker installation chrome.runtime.onInstalled.addListener(() => { console.log('Extension installed. Setting up alarms...'); chrome.alarms.create('myAlarm', { periodInMinutes: 1 }); }); // Event listener for alarms chrome.alarms.onAlarm.addListener((alarm) => { if (alarm.name === 'myAlarm') { console.log('Alarm triggered!'); // Perform some background task // Note: If the service worker was terminated, it will be woken up for this event. } }); // Optional: Handle messages from other parts of the extension chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.action === 'getData') { // Simulate fetching data sendResponse({ data: 'Some data from service worker' }); } return true; // Keep the message channel open for async response });
2. `chrome.webRequest`ãã`declarativeNetRequest`ãžã®çœ®ãæã
`chrome.webRequest` APIã¯ããããã¯ãŒã¯ãªã¯ãšã¹ãã®ååããããã¯ã倿Žããªãã€ã¬ã¯ãã®ããã®åºç¯ãªæ©èœãæäŸããŠããŸããããããã§ã¹ãV3ã§ã¯ãã»ãã¥ãªãã£ãšãã©ã€ãã·ãŒäžã®çç±ããããã®æ©èœãå€§å¹ ã«å¶éãããŠããŸããäž»ãªä»£æ¿ææ®µã¯`declarativeNetRequest` APIã§ãã
ãªã倿Žãããã®ãïŒ
`webRequest` APIã䜿çšãããšãæ¡åŒµæ©èœã¯ãã©ãŠã¶ãè¡ããã¹ãŠã®ãããã¯ãŒã¯ãªã¯ãšã¹ããæ€æ»ããã³å€æŽã§ããŸãããããã¯ãã©ã€ãã·ãŒãªã¹ã¯ããããããŸããããªããªããæ¡åŒµæ©èœãæ©å¯æ§ã®é«ããŠãŒã¶ãŒããŒã¿ãèšé²ããå¯èœæ§ããã£ãããã§ãããŸãããã¹ãŠã®ãªã¯ãšã¹ããJavaScriptã§ååãããšé ããªãå¯èœæ§ããããããããã©ãŒãã³ã¹ã«ã圱é¿ããããŸããã`declarativeNetRequest`ã¯ãååããžãã¯ããã©ãŠã¶ã®ãã€ãã£ããããã¯ãŒã¯ã¹ã¿ãã¯ã«ç§»è¡ãããŸããããã«ãããæ¡åŒµæ©èœãæç€ºçã«èš±å¯ãããªãéããªã¯ãšã¹ãã®è©³çްãçŽæ¥èŠãããšããªããããããããã©ãŒãã³ã¹ãé«ãããã©ã€ãã·ãŒãä¿è·ãããŸãã
ç§»è¡æŠç¥ïŒ
- 宣èšçã«ãŒã«ã®çè§£ïŒ åœä»€çãªã³ãŒãã®ä»£ããã«ã`declarativeNetRequest`ã¯å®£èšçãªã¢ãããŒãã䜿çšããŸããäžèŽãããããã¯ãŒã¯ãªã¯ãšã¹ãã«å¯ŸããŠå®è¡ããã¢ã¯ã·ã§ã³ïŒäŸïŒãããã¯ããªãã€ã¬ã¯ããããããŒã®å€æŽïŒãæå®ããäžé£ã®ã«ãŒã«ïŒJSONãªããžã§ã¯ãïŒãå®çŸ©ããŸãã
- ã«ãŒã«ã®å®çŸ©ïŒ ã«ãŒã«ã¯æ¡ä»¶ïŒäŸïŒURLãã¿ãŒã³ããªãœãŒã¹ã¿ã€ãããã¡ã€ã³ïŒãšã¢ã¯ã·ã§ã³ãæå®ããŸãã`webRequest`ã®ããããã³ã°ãŸãã¯ãªãã€ã¬ã¯ãã®ããžãã¯ããããã®ã«ãŒã«ã»ããã«å€æããå¿ èŠããããŸãã
- ã«ãŒã«ã®å¶éïŒ ç»é²ã§ããã«ãŒã«ãšã«ãŒã«ã»ããã®æ°ã«ã¯å¶éãããããšã«æ³šæããŠãã ãããè€éãªãã£ã«ã¿ãªã³ã°ã·ããªãªã§ã¯ãã«ãŒã«ã»ãããåçã«æŽæ°ããå¿ èŠããããããããŸããã
- åçãªå€æŽã®äžå¯ïŒ `webRequest`ãšã¯ç°ãªãã`declarativeNetRequest`ã¯ãªã¯ãšã¹ãããã£ãããããŒãåãæ¹æ³ã§åçã«å€æŽããããšã¯ã§ããŸãããæ¡åŒµæ©èœã®ã³ã¢æ©èœã詳现ãªãªã¯ãšã¹ã倿Žã«äŸåããŠããå Žåã¯ããã®èšèšãåè©äŸ¡ãããã代æ¿ã¢ãããŒããæš¡çŽ¢ããå¿ èŠããããŸãã
- ããããã³ã°ãšãªãã€ã¬ã¯ãïŒ ãªã¯ãšã¹ãã®ãããã¯ã¯ç°¡åã§ãããªãã€ã¬ã¯ãã«ã¯`redirect`ã¢ã¯ã·ã§ã³ã䜿çšããæ°ããURLãæå®ããŸãã
- ããããŒæäœïŒ MV3ã§ã¯ãªã¯ãšã¹ãããããŒã®å€æŽã«å¶éããããŸãã`declarativeNetRequest`ã®`requestHeaders`ãš`responseHeaders`ã䜿çšããŠç¹å®ã®ããããŒã远å ãŸãã¯åé€ã§ããŸãããè€éãªå€æã¯ãµããŒããããŠããŸããã
- ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ïŒ äžè¬çã«ã¯é«éã§ããã倿°ã®ã«ãŒã«ã管çãããšããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããå¹çã®ããã«ã«ãŒã«ã»ãããæé©åããŠãã ããã
- äŸïŒ
ãããã§ã¹ãV2 (ç»åã®ãããã¯):
chrome.webRequest.onBeforeRequest.addListener( function(details) { return { cancel: true }; }, { urls: ["*://*.example.com/*.png"] }, ["blocking"] );ãããã§ã¹ãV3 (`declarativeNetRequest`ã䜿çš):
ãŸããã«ãŒã«ãJSONãã¡ã€ã«ïŒäŸïŒ
rules.jsonïŒã§å®çŸ©ããŸãã[ { "id": 1, "priority": 1, "action": {"type": "block"}, "condition": { "urlFilter": "*.png", "domains": ["example.com"], "resourceTypes": ["image"] } } ]次ã«ããµãŒãã¹ã¯ãŒã«ãŒïŒãŸãã¯åæèšå®ã¹ã¯ãªããïŒã§ïŒ
chrome.runtime.onInstalled.addListener(() => { chrome.declarativeNetRequest.updateDynamicRules({ addRules: [ { "id": 1, "priority": 1, "action": {"type": "block"}, "condition": { "urlFilter": "*.png", "domains": ["example.com"], "resourceTypes": ["image"] } } ], removeRuleIds: [1] // To remove if it already exists }); });
3. ã³ã³ãã³ãã¹ã¯ãªããã®å®è¡ãšéä¿¡ã®åŠç
ã³ã³ãã³ãã¹ã¯ãªããã¯ãWebããŒãžã®ã³ã³ããã¹ãã§å®è¡ãããJavaScriptãã¡ã€ã«ã§ãããã®åºæ¬çãªç®çã¯åãã§ãããMV3ã§ã¯ããããã©ã®ããã«å®è¡ãããæ¡åŒµæ©èœã®ä»ã®éšåãšçžäºäœçšããããæŽç·ŽãããŠããŸãã
äž»ãªå€æŽç¹ãšæŠç¥ïŒ
- å®è¡ã³ã³ããã¹ãïŒ ã³ã³ãã³ãã¹ã¯ãªããã¯åŒãç¶ãããŒãžã«æ¿å ¥ã§ããŸãããããã`chrome.scripting.executeScript`ãä»ããŠçŽæ¥JavaScriptãæ¿å ¥ããèœåããä»ã§ã¯ããã°ã©ã ã«ããã¹ã¯ãªããæ¿å ¥ã®æšå¥šæ¹æ³ãšãªã£ãŠããŸãã
- éåæã€ã³ãžã§ã¯ã·ã§ã³ïŒ `chrome.scripting.executeScript`ã䜿çšããå Žåãå®è¡ã¯éåæã§ããã¹ã¯ãªãããæ¿å ¥ããå®è¡ãããã®ãåŸ ã£ãŠããããã®DOMãã°ããŒãã«ã¹ã³ãŒããšå¯Ÿè©±ããããã«ã³ãŒãã確èªããŠãã ããã
- `frameId`ã®èªèïŒ æ¡åŒµæ©èœãiframeãšå¯Ÿè©±ããå Žåãã¹ã¯ãªãããæ¿å ¥ãããã¡ãã»ãŒãžãéä¿¡ãããããéã«`frameId`ããããã£ã«æ³šæããŠãã ããã
- DOMã¢ã¯ã»ã¹ïŒ DOMãžã®ã¢ã¯ã»ã¹ã¯äž»èŠãªæ©èœã®ãŸãŸã§ãããã ããDOMæäœããã¹ãããŒãžã®ã¹ã¯ãªãããšå¹²æžããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
- ãµãŒãã¹ã¯ãŒã«ãŒãšã®éä¿¡ïŒ ã³ã³ãã³ãã¹ã¯ãªããã¯ãæ¡åŒµæ©èœã®ããã¯ãšã³ãããžãã¯ãå¿ èŠãšããã¿ã¹ã¯ã®ããã«ããµãŒãã¹ã¯ãŒã«ãŒïŒããã¯ã°ã©ãŠã³ãããŒãžã眮ãæããïŒãšéä¿¡ããå¿ èŠããããŸãã`chrome.runtime.sendMessage()`ãš`chrome.runtime.onMessage()`ã䜿çšããŸãã
- äŸïŒ
ã¹ã¯ãªããã®æ¿å ¥ãšéä¿¡ (ãããã§ã¹ãV3):
// From your popup or options page chrome.scripting.executeScript({ target: { tabId: YOUR_TAB_ID }, files: ['content.js'] }, (results) => { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); return; } console.log('Content script injected:', results); // Now communicate with the injected content script chrome.tabs.sendMessage(YOUR_TAB_ID, { action: "processPage" }, (response) => { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); return; } console.log('Response from content script:', response); }); }); // In content.js: chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.action === "processPage") { console.log('Processing page...'); const pageTitle = document.title; // Perform some DOM manipulation or data extraction sendResponse({ success: true, title: pageTitle }); } return true; // Keep the channel open for async response });
4. `eval()`ãš`new Function()`ã®å»æ¢
ã»ãã¥ãªãã£äžã®çç±ããããããã§ã¹ãV3ã§ã¯æ¡åŒµæ©èœã³ãŒãå ã§ã®`eval()`ããã³`new Function()`ã®äœ¿çšãçŠæ¢ãããŠããŸãããããã®é¢æ°ã¯ä»»æã®ã³ãŒãå®è¡ãèš±å¯ãããããé倧ãªã»ãã¥ãªãã£è匱æ§ãšãªãåŸãŸãã
ç§»è¡æŠç¥ïŒ
- ã³ãŒãã®åèšèšïŒ æãå ç¢ãªè§£æ±ºçã¯ãåçãªã³ãŒãå®è¡ãé¿ããããã«ã³ãŒããåèšèšããããšã§ãã颿°åãã³ãŒãã¹ãããããåçã«çæããŠããå Žåã¯ãäºåå®çŸ©ãããæ§é ãèšå®ãªããžã§ã¯ãããŸãã¯ãã³ãã¬ãŒããªãã©ã«ã®äœ¿çšãæ€èšããŠãã ããã
- JSONã®ããŒã¹ïŒ `eval()`ãJSONã®ããŒã¹ã«äœ¿çšãããŠããå Žåã¯ã`JSON.parse()`ã«åãæ¿ããŸããããã¯JSONããŒã¿ãåŠçããããã®æšæºçã§å®å šãªæ¹æ³ã§ãã
- ãªããžã§ã¯ããããã³ã°ïŒ `new Function()`ãå ¥åã«åºã¥ããŠåçã«é¢æ°ãäœæããããã«äœ¿çšãããŠããå Žåã¯ããªããžã§ã¯ãããããswitchã¹ããŒãã¡ã³ãã䜿çšããŠå ¥åãäºåå®çŸ©ããã颿°ã«ãããã³ã°ããããšãæ€èšããŠãã ããã
- äŸïŒ
以å (ãããã§ã¹ãV2, éæšå¥š):
const dynamicFunctionName = 'myDynamicFunc'; const code = 'console.log("Hello from dynamic function!");'; const dynamicFunc = new Function(code); dynamicFunc(); // Or for JSON parsing: const jsonString = '{"key": "value"}'; const jsonData = eval('(' + jsonString + ')'); // Insecureä»¥åŸ (ãããã§ã¹ãV3, å®å š):
// For dynamic functions: function myDynamicFunc() { console.log("Hello from pre-defined function!"); } // If you need to call it dynamically based on a string, you can use an object map: const availableFunctions = { myDynamicFunc: myDynamicFunc }; const functionToCall = 'myDynamicFunc'; if (availableFunctions[functionToCall]) { availableFunctions[functionToCall](); } else { console.error('Function not found'); } // For JSON parsing: const jsonString = '{"key": "value"}'; const jsonData = JSON.parse(jsonString); // Secure and standard console.log(jsonData.key); // "value"
5. ãã®ä»ã®éèŠãªAPIã«é¢ããèæ ®äºé
ãããã§ã¹ãV3ã¯ä»ã®ããã€ãã®APIã«ã圱é¿ãäžããããããããã®å€æŽãèªèããããšãéèŠã§ãã
- `chrome.tabs` APIïŒ `chrome.tabs` APIã®äžéšã®ã¡ãœããã¯ãç¹ã«ã¿ãã®äœæãšç®¡çã«é¢ããŠåäœãç°ãªãå ŽåããããŸããææ°ã®æšå¥šãã¿ãŒã³ã䜿çšããŠããããšã確èªããŠãã ããã
- `chrome.storage` APIïŒ `chrome.storage` APIïŒlocalããã³syncïŒã¯ã»ãŒåããŸãŸã§ããããµãŒãã¹ã¯ãŒã«ãŒã®çµäºåŸãããŒã¿ãæ°žç¶åããããã«äžå¯æ¬ ã§ãã
- æš©éïŒ æ¡åŒµæ©èœã®æš©éãåè©äŸ¡ããŠãã ãããMV3ã¯å¿ èŠãªæš©éã®ã¿ãèŠæ±ããããšã奚å±ãããã詳现ãªå¶åŸ¡ãæäŸããŸãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹èŠçŽ ïŒ æ¡åŒµæ©èœã®ãããã¢ãããšãªãã·ã§ã³ããŒãžã¯äž»èŠãªUIèŠçŽ ãšããŠæ®ããŸããããããæ°ãããµãŒãã¹ã¯ãŒã«ãŒã¢ãŒããã¯ãã£ã§åäœããããã«æŽæ°ãããŠããããšã確èªããŠãã ããã
ç§»è¡ã®ããã®ããŒã«ãšãã¹ããã©ã¯ãã£ã¹
æ¡åŒµæ©èœã®ç§»è¡ã¯è€éãªããã»ã¹ã«ãªãå¯èœæ§ããããŸãã幞ããªããšã«ããããããã¹ã ãŒãºã«ããããã®ããŒã«ãšãã¹ããã©ã¯ãã£ã¹ããããŸãã
- å ¬åŒããã¥ã¡ã³ãïŒ ãã©ãŠã¶ãã³ããŒïŒç¹ã«ChromeãšFirefoxïŒã®ããã¥ã¡ã³ããäž»èŠãªãªãœãŒã¹ã§ãããããã§ã¹ãV3ç§»è¡ã¬ã€ãã培åºçã«èªãã§ãã ããã
- ãã©ãŠã¶éçºè ããŒã«ïŒ ã¿ãŒã²ãããã©ãŠã¶ã®éçºè ããŒã«ã掻çšããŠãã ããããšã©ãŒããµãŒãã¹ã¯ãŒã«ãŒã®ã©ã€ããµã€ã¯ã«ããããã¯ãŒã¯ã¢ã¯ãã£ããã£ã«é¢ãã貎éãªæŽå¯ãæäŸããŸãã
- 段éçãªç§»è¡ïŒ å€§èŠæš¡ãªæ¡åŒµæ©èœãããå Žåã¯ã段éçãªç§»è¡æŠç¥ãæ€èšããŠãã ãããäžåºŠã«1ã€ã®æ©èœãŸãã¯APIãç§»è¡ãã培åºçã«ãã¹ãããŠããæ¬¡ã«é²ã¿ãŸãã
- èªåãã¹ãïŒ å ç¢ãªãã¹ãã¹ã€ãŒããå®è£ ããŠãã ãããèªåãã¹ãã¯ãååž°ããã£ããããç§»è¡ãããæ¡åŒµæ©èœãããŸããŸãªã·ããªãªã§æåŸ ã©ããã«åäœããããšã確èªããããã«éèŠã§ãã
- ã³ãŒãã®ãªã³ãã£ã³ã°ãšåæïŒ MV3éçºçšã«èšå®ããããªã³ã¿ãŒïŒESLintãªã©ïŒã䜿çšããŠãæœåšçãªåé¡ãæ©æã«çºèŠããŸãã
- ã³ãã¥ããã£ãã©ãŒã©ã ãšãµããŒãïŒ éçºè ã³ãã¥ããã£ã«åå ããŠãã ãããå€ãã®éçºè ãåæ§ã®èª²é¡ã«çŽé¢ããŠãããçµéšãå ±æããããšã§å¹æçãªè§£æ±ºçã«ã€ãªããããšããããŸãã
- ãããã¯ãããæ©èœã®ä»£æ¿æ¡ãæ€èšããïŒ æ¡åŒµæ©èœã®ã³ã¢æ©èœããMV3ã§å€§å¹ ã«å¶éãŸãã¯åé€ãããAPIïŒç¹å®ã®`webRequest`æ©èœãªã©ïŒã«äŸåããŠããå Žåã¯ã代æ¿ã¢ãããŒããæ€èšããŠãã ãããããã«ã¯ããŸã å©çšå¯èœãªãã©ãŠã¶APIãæŽ»çšããããã¯ã©ã€ã¢ã³ãåŽã®ãã¥ãŒãªã¹ãã£ãã¯ã䜿çšããããæ©èœã®å®è£ ãåèãããããããšãå«ãŸããå ŽåããããŸãã
ãããã§ã¹ãV3ã«é¢ããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªå©çšè ãã¿ãŒã²ãããšããéçºè ãšããŠãMV3ã®å€æŽãããŸããŸãªå°åãç¶æ³ã®ãŠãŒã¶ãŒã«ã©ã®ããã«åœ±é¿ããããèæ ®ããããšãéèŠã§ãã
- ããã€ã¹éã§ã®ããã©ãŒãã³ã¹ïŒ ãµãŒãã¹ã¯ãŒã«ãŒã®å¹çåäžã¯ãå€ãã®æ°èåžå Žã§æ®åããŠãããæ§èœã®äœãããã€ã¹ãã€ã³ã¿ãŒãããæ¥ç¶ãé ããŠãŒã¶ãŒã«ãšã£ãŠç¹ã«æçã§ãã
- äžççãªãã©ã€ãã·ãŒãžã®æžå¿µïŒ MV3ã§ã®ãã©ã€ãã·ãŒä¿è·ã®åŒ·åã¯ãäžççã«é«ãŸãããŒã¿ãã©ã€ãã·ãŒèŠå¶ïŒäŸïŒGDPRãCCPAïŒããŠãŒã¶ãŒã®æåŸ ãšäžèŽããŠããŸããããã«ããã倿§ãªãŠãŒã¶ãŒããŒã¹ã®éã§ãã倧ããªä¿¡é Œãè²ãããšãã§ããŸãã
- Webæšæºãšã®æŽåæ§ïŒ MV3ã¯äž»ã«Chromiumã«ãã£ãŠæšé²ãããŠããŸãããããå®å šã§ãã©ã€ãã·ãŒãä¿è·ããWebæ¡åŒµæ©èœã¢ãã«ãžã®ç§»è¡ã¯äžççãªãã¬ã³ãã§ãããããã®å€æŽã«å ãããããšã§ãæ¡åŒµæ©èœãããåºç¯ãªãã©ãããã©ãŒã äºææ§ãšå°æ¥ã®Webæšæºã«å¯Ÿå¿ã§ããããã«ãªããŸãã
- ããã¥ã¡ã³ãã®ã¢ã¯ã»ã·ããªãã£ïŒ äŸåããç§»è¡ãªãœãŒã¹ãå¿ èŠã«å¿ããŠã¢ã¯ã»ã¹å¯èœã§ãæç¢ºã«ç¿»èš³ãããŠããããšã確èªããŠãã ããããã®èšäºã¯è±èªã§ãããäžçäžã®éçºè ãããŒã«ã©ã€ãºããããªãœãŒã¹ãæ±ããå¯èœæ§ããããŸãã
- å°åããŸããã ãã¹ãïŒ æ¡åŒµæ©èœã®æ©èœããããã¯ãŒã¯ã«äŸåããŠãããããã±ãŒã«ã«ãã£ãŠUIã«åŸ®åŠãªéããçããå¯èœæ§ãããå Žåã¯ããã¹ãã倿§ãªå°ççå Žæãšãããã¯ãŒã¯æ¡ä»¶ãã«ããŒããŠããããšã確èªããŠãã ããã
ãããã§ã¹ãV3ã«ããããã©ãŠã¶æ¡åŒµæ©èœã®æªæ¥
ãããã§ã¹ãV3ã¯åãªãã¢ããããŒãã§ã¯ãªããããå®å šã§ããã©ã€ããŒãã§ãããã©ãŒãã³ã¹ã®é«ãWebæ¡åŒµæ©èœãšã³ã·ã¹ãã ãžã®éèŠãªäžæ©ã§ããç§»è¡ã«ã¯èª²é¡ã䌎ããŸãããéçºè ãããè¯ãããã責任ããæ¡åŒµæ©èœãæ§ç¯ããæ©äŒãæäŸããŸããäž»èŠãªAPIã®å€æŽãçè§£ããæŠç¥çãªç§»è¡ã¢ãããŒããæ¡çšããããšã§ãããªãã®ãã©ãŠã¶æ¡åŒµæ©èœãäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠé¢é£æ§ãšäŸ¡å€ãä¿ã¡ç¶ããããšãä¿èšŒã§ããŸãã
ãã®ç§»è¡ãåãå ¥ããæ°ããèœåãæŽ»çšãã驿°ãç¶ããŠãã ããããã©ãŠã¶æ¡åŒµæ©èœã®æªæ¥ã¯ããã«ãããããã¯åŒ·åãããã»ãã¥ãªãã£ãšãŠãŒã¶ãŒã®ä¿¡é Œãšããåºç€ã®äžã«ç¯ãããŠããŸãã